﻿namespace GSC.WebControls.ComponentModel.Design
{
    using System;
    using System.ComponentModel;
    using System.Globalization;
    using System.Resources;
    /// <summary>
    /// 本地化指定的说明。
    /// </summary>
    /// <remarks>本地化指定的说明。</remarks>
    [AttributeUsageAttribute(AttributeTargets.All, AllowMultiple = false, Inherited = true)]
    public class SRDescriptionAttribute : DescriptionAttribute
    {
        /// <summary>
        /// 重写获取存储在此属性 (Attribute) 中的说明。
        /// </summary>
        /// <remarks>重写获取存储在此属性 (Attribute) 中的说明。</remarks>
        /// <value>string</value>
        public override string Description
        {
            get
            {
                return this.GetLocalizedString(this.DescriptionValue);
            }
        }
        /// <summary>
        /// 查阅指定类别的本地化名称。
        /// </summary>
        /// <remarks>查阅指定类别的本地化名称。</remarks>
        /// <param name="value"></param>
        /// <returns>string</returns>
        protected virtual string GetLocalizedString(string value)
        {
            string r = null;
            for (CultureInfo culture = CultureInfo.CurrentCulture; r == null && culture != CultureInfo.InvariantCulture; culture = culture.Parent)
            {
                r = (string)this.resourceManager.GetObject(value, culture);
            }
            return r;
        }
        /// <summary>
        /// 本地化资源管理。
        /// </summary>
        /// <remarks>本地化资源管理。</remarks>
        ResourceManager resourceManager;
        /// <summary>
        /// 初始化。
        /// </summary>
        /// <remarks>初始化。</remarks>
        /// <param name="description">设置备注内容。</param>
        public SRDescriptionAttribute(string description)
            : base(description)
        {
            this.resourceManager = null;
        }
        /// <summary>
        /// 初始化。
        /// </summary>
        /// <remarks>初始化。</remarks>
        public SRDescriptionAttribute()
            : base(string.Empty)
        {
            this.resourceManager = null;
        }
                /// <summary>
        /// 初始化。
        /// </summary>
        /// <remarks>初始化。</remarks>
        /// <param name="description">设置备注内容。</param>
        /// <param name="resourceSource">指定的 Type 中的信息在附属程序集内查找资源。</param>
        public SRDescriptionAttribute(string description, Type resourceSource)
            : base(description) { this.resourceManager = new ResourceManager(resourceSource); }
        /// <summary>
        /// 初始化。
        /// </summary>
        /// <remarks>初始化。</remarks>
        /// <param name="description">设置备注内容。</param>
        /// <param name="baseName">资源的根名称。例如，名为“MyResource.en-US.resources”的资源文件的根名称为“MyResource”。</param>
        /// <param name="classAssembly">类类型对象。</param> 
        public SRDescriptionAttribute(string description, string baseName, Type classAssembly)
            : base(description) { this.resourceManager = new ResourceManager(baseName, System.Reflection.Assembly.GetAssembly(classAssembly)); }
        /// <summary>
        /// 初始化。
        /// </summary>
        /// <remarks>初始化。</remarks>
        /// <param name="description">设置备注内容。</param>
        /// <param name="baseName">资源的根名称。例如，名为“MyResource.en-US.resources”的资源文件的根名称为“MyResource”。</param>
        /// <param name="classAssembly">类类型对象。</param> 
        /// <param name="usingResourceSet">要使用的自定义 ResourceSet 的 Type。如果为 nullNothingnullptrnull 引用（在 Visual Basic 中为 Nothing），则使用默认的运行时 ResourceSet。</param> 
        public SRDescriptionAttribute(string description, string baseName, Type classAssembly, Type usingResourceSet)
            : base(description)
        {
            this.resourceManager = new ResourceManager(baseName, System.Reflection.Assembly.GetAssembly(classAssembly), usingResourceSet);
        }
    }
}